﻿using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.Events;
///<summary>
///1. 提供给外部添加帧更新时间的方法
///2. 提供给外部添加协程的方法(协程是unity提供的方法 , 必须继承mono才能使用)
///</summary>
public class MonoManager : BaseManager<MonoManager>
{
    private MonoController controller;

    public MonoManager()
    {//专门写个构造函数其实就是为了让全场有且仅有一个MonoController , 我们能做到有且仅有一个MonoManager , 但是不这样写的话就有可能有不止一个monoController
        //之所以有一个MonoController一个MonoManager , 是因为按照我们的习惯 , Manager都要继承BasePanel , 且不能继承MonoBehaviour , 那么就不能使用Update和协程 , 所以为了能用mono的函数就专门写了个Controller
        //而为了维护管理类不继承Mono的尊严 , 就又写了个MonoManager把MonoController封装了一次 
        GameObject obj = new GameObject("MonoController");
        controller = obj.AddComponent<MonoController>();
    }
    public void AddUpdateListener(UnityAction unityAction)
    {
        controller.AddUpdateListener(unityAction);
    }

    /// <summary>
    /// 有加就有减 , 提供给外部的移除帧更新的方法
    /// </summary>
    /// <param name="unityAction"></param>
    public void RemoveUpdateListener(UnityAction unityAction)
    {
        controller.RemoveUpdateListener(unityAction);
    }

    /// <summary>
    /// 下边就是对协程的封装 , 以后不论谁需要开启协程 , 就把协程函数传给这个单例Monomanager , 让这个monoManager调用controller开启协程
    /// </summary>
    /// <param name="routine"></param>
    /// <returns></returns>
    public Coroutine StartCoroutine(IEnumerator routine)
    {
        return controller.StartCoroutine(routine);
    }
    public Coroutine StartCoroutine(string methodName)
    {
        return controller.StartCoroutine(methodName);
    }
    public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value)
    {
        return controller.StartCoroutine(methodName, value);
    }
    public Coroutine StartCoroutine_Auto(IEnumerator routine)
    {
        return controller.StartCoroutine(routine);
    }
    public void StopAllCoroutines()
    {
        controller.StopAllCoroutines();
    }

    public void StopCoroutine(IEnumerator routine)
    {
        controller.StopCoroutine(routine);
    }

    public void StopCoroutine(Coroutine routine)
    {
        controller.StopCoroutine(routine);
    }

    public void StopCoroutine(string methodName)
    {
        controller.StopCoroutine(methodName);
    }
}




